(define-struct Person (name year kids))

(define Bart    (make-Person 'Bart    1979 empty))
(define Lisa    (make-Person 'Lisa    1981 empty))
(define Maggie  (make-Person 'Maggie  1988 empty))
(define Homer   (make-Person 'Homer   1955 (list Bart Lisa Maggie)))
(define Marge   (make-Person 'Marge   1956 (list Bart Lisa Maggie)))
(define Selma   (make-Person 'Selma   1950 empty))
(define Patty   (make-Person 'Patty   1950 empty))
(define Jackie  (make-Person 'Jackie  1926 (list Selma Patty Marge)))
(define Herbert (make-Person 'Herbert 1950 empty))
(define Mona    (make-Person 'Mona    1929 (list Homer Herbert)))
(define Abe     (make-Person 'Abe     1920 (list Homer Herbert)))

; bullet: string
; What to put in front of each name
;
(define bullet "|_ ")

; generation-indent: string
; How to indent each succeeding generation.
;
(define generation-indent
  ; A more complicated version: a long bullet requires more generation-indent.
  (string-append (make-string (string-length bullet) #\space)))

  
;; Person->string-help: Person -> string
;; Return the string representation of "a-p".
(define (Person->string-help a-p)
  (string-append (symbol->string (Person-name a-p))
                 " (b. "
                 (number->string (Person-year a-p))
                 ")"
                 newline))

;; Person->string: Person -> string (duh!)
;; Return the string representation of a-p and descendents, as described in lab06.html
;;
(define (Person->string a-p)
  (string-append (Person->string-help a-p)                 
                 (Persons->string (Person-kids a-p)
                                  "")))


;; Person->string-descendent: Person, string -> string
;; Return the string representation of "a-p" and descendents, except that
;; each line is prepended with "prefix" and "bullet".
;;
(define (Person->string-descendent a-p prefix)
  (string-append prefix
                 bullet
                 (Person->string-help a-p)
                 (Persons->string (Person-kids a-p)
                                  (string-append generation-indent prefix))))

;; Persons->string: list-of-person string --> string
;; Return the string representation of everybody in "people",
;; all concatenated into a single string,
;; with each line prepended by "prefix".
;;
(define (Persons->string  people prefix)
  (cond [(empty? people) ""]
        [(cons?  people)
         (string-append (Person->string-descendent (first people) prefix)
                        (Persons->string (rest people) prefix))]))

(display-string (Person->string  Bart))
(display-string (Person->string  Marge))
(display-string (Person->string  Jackie))
(display-string (Person->string  Abe))
